Skip to main content

Python 代码一键转流程图

在设计程序时,类图、流程图都是非常有用的工具。我们有很多工具可以绘制这些图形,甚至有些工具能够生成最基本的框架代码。除了在设计时使用外,很多时候我们也需要将已经写好的代码反向转成类图或流程图,尤其是在分享设计或写作业时。

代码转类图

转换代码为类图的工具有很多,常见的 IDE 如 VS Code、IntelliJ IDEA 都可以安装插件来完成这项工作。如果你使用的是微软的开发环境,Visual Studio 提供的“类设计器”功能,尤其强大,轻松超越了其他类似工具,可以称得上是“宇宙第一 IDE”。

代码转流程图

相较于类图,代码转流程图的需求较少,且现有工具相对较少。最近我需要将一些 Python 代码转化为流程图,经过搜索,我发现现有的实现都有一定的不足:要么使用了非常奇怪的技术(如正则表达式,简直让我震撼一下午),要么依赖环境过于苛刻(比如依赖某些不适合 macOS 的 PyGame 库),要么生成的流程图丑到极致(乱七八糟的线条、奇怪的颜色)。

看到一个高赞的 GitHub 项目 Vatsha/code_to_flowchart,它集合了上述几种“优点”,我决定自己动手做一个 Python 到流程图的转换工具。

PyFlowchart 的设计

当然,我不是在喷 Vatsha/code_to_flowchart,毕竟它的设计简单有效,利用 PyGame 做可视化也非常有创意。不过,我认为它在细节上仍有很大的改进空间,特别是它的界面和代码结构。

我参考了这个项目,并基于 flowchart.js 实现了自己的工具,命名为 PyFlowchart。起初我取名为 PyFlow,但在上传到 PyPi 时发现已被占用,于是改成了 PyFlowchart

flowchart.js

如果你使用 Typora,可能知道在 Typora 中使用 flow 可以通过简单的文本语言来写流程图。根据 Typora 文档,这个功能来自于开源的 flowchart.js

我将 Python 代码转化为这种 flowchart 文本语言,借助 flowchart.js.orgTyporafrancoislaberge/diagrams 等工具生成流程图。

例如:

st=>start: Start
op=>operation: Your Operation
cond=>condition: Yes or No?
e=>end

st->op->cond
cond(yes)->e
cond(no)->op

PyFlowchart

接下来简要介绍如何使用我实现的 PyFlowchart。更详细的说明请参考项目的 README

安装 PyFlowchart:

$ pip3 install pyflowchart

创建一个 simple.py 文件:

def foo(a, b):
if a:
print("a")
else:
for i in range(3):
print("b")
return a + b

运行 PyFlowchart:

$ python3 -m pyflowchart simple.py

它将输出如下的 flowchart 代码:

st4439920016=>start: start foo
io4439920208=>inputoutput: input: a, b
cond4439920592=>condition: if a
sub4439974736=>subroutine: print('a')
io4439974672=>inputoutput: output: (a + b)
e4439974352=>end: end function return
cond4439974224=>operation: print('b') while i in range(3)

st4439920016->io4439920208
io4439920208->cond4439920592
cond4439920592(yes)->sub4439974736
sub4439974736->io4439974672
io4439974672->e4439974352
cond4439920592(no)->cond4439974224
cond4439974224->io4439974672

生成流程图

你可以将上述生成的代码粘贴到 flowchart.js.org 的文本框中,右侧会自动生成流程图。

另外,如果你使用 Typora,可以直接将这些代码放入 flow 代码块中,Typora 会自动生成流程图。或者,你也可以使用命令行工具 francoislaberge/diagrams 来生成流程图。

如果生成的流程图不满意(如线条重叠),或者你想自定义样式,可以手动修改 flowchart 代码,非常方便。


实现原理

  1. 开始: PyFlowchart
  2. 输入 Python 源代码
  3. 代码转 AST
  4. AST 转节点图
  5. 节点图转流程图
  6. 输出流程图
  7. 结束

PyFlowchart 使用 Python 内置的 ast 包将代码转换为 AST(抽象语法树),然后将 AST 转换为自定义的节点(Node),这些节点在 flowchart 中对应不同类型的图形元素。遍历这些节点,即可生成完整的流程图。

关于 AST 包

ast 包允许我们将 Python 代码解析成一种数据结构,便于分析和操作。举例来说,下面是将 Python 代码转为 AST 的过程:

import ast
expr = """
def add(a, b):
return a + b
"""
expr_ast = ast.parse(expr)
ast.dump(expr_ast)

输出的 AST 可以帮助我们理解 Python 代码的结构。

PyFlowchart 的设计

Node 是最基础的类,代表流程图中的一个节点。其他节点类型(如 StartNodeEndNodeOperationNode)都继承自它。通过 fc_definition()fc_connection() 方法,这些节点可以转化为 flowchart 语言的字符串。

NodesGroup 是一个特殊的节点,它本身不会出现在流程图中,但可以包含其他节点(例如,if 语句或循环的嵌套结构)。

AstNode 用于将 AST 对象转换为节点对象,它的子类分别对应 AST 中的不同节点类型(如 IfLoopReturn)。

Flowchart 类代表整个流程图,它是 NodesGroup 的子类,包含了所有节点的集合,并能将它们输出为完整的 flowchart 代码。


项目地址与类图

项目地址:PyFlowchart GitHub

版权声明

本文为CSDN博主「CDFMLR」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u012419550/article/details/109258117


以上就是我对文档的重新整理。希望它能让你更容易阅读和理解内容!